package com.realshare.frame.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Logger;

/**
 * @author tfy
 * @ClassName: DateUtils
 * @Description: 日期工具类, 默认使用"yyyy-MM-dd HH:mm:ss"格式化日期
 * @date 2013年10月12日 下午9:41:28
 */
public final class DateUtils {

    public static final String PATTERN_DEFAULT = "yyyyMMddHHmmssSSS";

    public static final String[] DIVISION_STRING = new String[]{"-", " ","/", ":", "年", "月", "日", "时", "分", "秒", "毫秒"};

    /**
     * 英文简写    如：2010-12-01
     */
    public static final String PATTERN_SHORT = "yyyy-MM-dd";
    /**
     * 英文全称（默认）  如：2010-12-01 23:15:06
     */
    public static final String PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";
    /**
     * 精确到毫秒的完整时间    如：yyyy-MM-dd HH:mm:ss.S
     */
    public static final String PATTERN_FULL = "yyyy-MM-dd HH:mm:ss.S";
    /**
     * 中文简写  如：2010年12月01日
     */
    public static final String PATTERN_SHORT_CN = "yyyy年MM月dd日";
    /**
     * 中文全称  如：2010年12月01日  23时15分06秒
     */
    public static final String PATTERN_LONG_CN = "yyyy年MM月dd日  HH时mm分ss秒";
    /**
     * 精确到毫秒的完整中文时间  如：2010年12月01日  23时15分06秒670毫秒
     */
    public static final String PATTERN_FULL_CN = "yyyy年MM月dd日  HH时mm分ss秒SSS毫秒";
    private static final Logger LOGGER = Logger.getLogger("DateUtils");

    /**
     * @Description 获得默认的 date pattern
     */
    public static String getDatePattern() {
        return PATTERN_LONG;
    }

    /**
     * @param date
     * @return
     * @Description 返回格式化日期字符串, 如：2010-12-01
     */
    public static String formatShortDate(Date date) {
        return format(date, PATTERN_SHORT);
    }

    /**
     * @param date
     * @return
     * @Description 返回格式化日期字符串, 如：2010-12-01 23:15:06
     */
    public static String formatLongDate(Date date) {
        return format(date, getDatePattern());
    }

    /**
     * @param date    日期
     * @param pattern 日期格式
     * @return
     * @Description 返回用户格式格式化日期字符串
     */
    public static String format(Date date, String pattern) {
        String result = "";
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            result = df.format(date);
        }
        return (result);
    }

    /**
     * @return
     * @Description 返回当前日期, 如：2010-12-01
     */
    public static String getNowDate() {
        return format(new Date(), PATTERN_SHORT);
    }

    /**
     * @return
     * @Description 返回当前日期时间, 如：2010-12-01 23:15:06
     */
    public static String getNowDateTime() {
        return format(new Date(), getDatePattern());
    }

    /**
     * @param format
     * @return
     * @Description 根据用户格式返回当前日期
     */
    public static String getNow(String format) {
        return format(new Date(), format);
    }

    /**
     * @Description 获取时间戳
     */
    public static String getTimeString() {
        return format(Calendar.getInstance().getTime(), PATTERN_FULL);
    }

    /**
     * @param date 日期
     * @return
     * @Description 获取日期年份
     */
    public static String getYear(Date date) {
        String result = "";
        if (date != null) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            result = String.valueOf(cal.get(Calendar.YEAR));
        } else {
            LOGGER.warning("获取日期年份数据错误");
        }
        return result;
    }

    /**
     * @param strDate 日期字符串
     * @return
     * @Description 使用用户格式提取字符串日期
     */
    public static Date parse(String strDate) {
        SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_DEFAULT);
        try {
            return sdf.parse(convertTime(strDate));
        } catch (ParseException e) {
            LOGGER.warning("字符串日期解析错误：" + e.getMessage());
            return null;
        }
    }

    /**
     * @param date 日期
     * @param n    要增加的年数
     * @return
     * @Description 在日期上增加数个整年
     */
    public static Date addYear(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, n);
        return cal.getTime();
    }

    /**
     * @param date 日期
     * @param n    要增加的月数
     * @return
     * @Description 在日期上增加数个整月
     */
    public static Date addMonth(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, n);
        return cal.getTime();
    }

    /**
     * @param date 日期
     * @param n    要增加的天数
     * @return
     * @Description 在日期上增加天数
     */
    public static Date addDay(Date date, int n) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, n);
        return cal.getTime();
    }

    /**
     * @param date   日期字符串
     * @return
     * @Description 按用户格式字符串计算距离今天的天数
     */
    public static int countDays(String date) {
        long bt = Calendar.getInstance().getTime().getTime();
        Calendar c = Calendar.getInstance();
        c.setTime(parse(date));
        long at = c.getTime().getTime();
        return (int) (bt / 1000 - at / 1000) / 3600 / 24;
    }

    public static String formatTime(Long value) {
        Long result = value / 1000000L;
        if (result == 0L) {
            return value / 1000L + "μs";
        }
        return result + "ms";
    }

    // 日期转化为大写
    public static String dataToUpper(String dateStr) {
        String res = "";
        Date date = null;
        try {
            date = parse(dateStr);
        } catch (Exception e) {
            // 日期型字符串格式错误  
            System.out.println("日期型字符串格式错误");
        }
        if (date != null) {
            Calendar ca = Calendar.getInstance();
            ca.setTime(date);
            int year = ca.get(Calendar.YEAR);
            int month = ca.get(Calendar.MONTH) + 1;
            int day = ca.get(Calendar.DAY_OF_MONTH);
            res = numToUpper(year) + "年" + monthToUppder(month) + "月" + dayToUppder(day) + "日";
        }
        return res;
    }

    // 将数字转化为大写
    public static String numToUpper(int num) {
        // String u[] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};  
        String u[] = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
        char[] str = String.valueOf(num).toCharArray();
        String rstr = "";
        for (int i = 0; i < str.length; i++) {
            rstr = rstr + u[Integer.parseInt(str[i] + "")];
        }
        return rstr;
    }

    // 月转化为大写
    public static String monthToUppder(int month) {
        if (month < 10) {
            return numToUpper(month);
        } else if (month == 10) {
            return "十";
        } else {
            return "十" + numToUpper(month - 10);
        }
    }

    // 日转化为大写
    public static String dayToUppder(int day) {
        if (day < 20) {
            return monthToUppder(day);
        } else {
            char[] str = String.valueOf(day).toCharArray();
            if (str[1] == '0') {
                return numToUpper(Integer.parseInt(str[0] + "")) + "十";
            } else {
                return numToUpper(Integer.parseInt(str[0] + "")) + "十"
                        + numToUpper(Integer.parseInt(str[1] + ""));
            }
        }
    }

    public static String getDateFormat(final String d) {
        int dateLength = d.length();
        String separator = d.replaceAll("[0-9]", "") + " ";//补位
        char[] ch = separator.toCharArray();
        String[] s = {"yyyy", "MM", "dd", "HH", "mm", "ss", "SSS", ""};
        String result = "";
        boolean parse = false;
        switch (dateLength) {
            case 23: //2015-12-13 12:11:00.000
                parse = true;
                break;
            case 20: //2015年12月13日12时11分00秒
                parse = true;
                separator = separator.trim();
                ch = separator.toCharArray();
                break;
            case 19: //2015-12-13 12:11:00
                parse = true;
                break;
            case 10: //2015-12-13
                parse = true;
                break;
            default:
                System.err.println("不认识的格式：" + d);
                break;
        }
        if (parse) {
            for (int i = 0, len = ch.length; i < len; i++) {
                result += s[i] + ch[i];
            }
        }
        return result.trim();
    }

    private static String convertTime(String time) {
        for (String str : DIVISION_STRING) {
            time = time.replaceAll(str, "");
        }
        if (time.length() < PATTERN_DEFAULT.length()) {
            StringBuilder timeBuilder = new StringBuilder(time);
            for (int i = timeBuilder.length(); i < PATTERN_DEFAULT.length(); i++) {
                timeBuilder.append("0");
            }
            time = timeBuilder.toString();
        }
        return time.trim();
    }

    /**
     * 功能描述：时间相减得到天数
     *
     * @return long
     * @author Administrator
     */
    public static int getDayDiff(Date maxDate, Date minDate) {
        if(maxDate==null||minDate==null){
            return 0;
        }
        return (int) ((maxDate.getTime() - minDate.getTime()) / (24 * 60 * 60 * 1000));
    }

    /**
     * 获取两个日期相差的月数
     *
     * @return 如果d1>d2返回 月数差 否则返回0
     */
    public static int getMonthDiff(Date maxDate, Date minDate) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(maxDate);
        c2.setTime(minDate);
        if (c1.getTimeInMillis() < c2.getTimeInMillis()) return 0;
        int year1 = c1.get(Calendar.YEAR);
        int year2 = c2.get(Calendar.YEAR);
        int month1 = c1.get(Calendar.MONTH);
        int month2 = c2.get(Calendar.MONTH);
        int day1 = c1.get(Calendar.DAY_OF_MONTH);
        int day2 = c2.get(Calendar.DAY_OF_MONTH);
        // 获取年的差值 假设 d1 = 2015-8-16  d2 = 2011-9-30
        int yearInterval = year1 - year2;
        // 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
        if (month1 < month2 || month1 == month2 && day1 < day2) yearInterval--;
        // 获取月数差值
        int monthInterval = (month1 + 12) - month2;
        if (day1 < day2) monthInterval--;
        monthInterval %= 12;
        return yearInterval * 12 + monthInterval;
    }

    public static int getYearDiff(Date maxDate, Date minDate) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        c1.setTime(minDate);
        c2.setTime(maxDate);
        int result = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR);
        return Math.abs(result);
    }

    public static void main(String[] args) {
    }

}

